/**
 * Copyright (C) 2012 The SkyTvOS Project
 * <p/>
 * Version     Date           Author
 * ─────────────────────────────────────
 * 2014年12月20日         luwei
 */

package com.coocaa.x.uipackage;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;

import org.xmlpull.v1.XmlPullParser;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class SkinManager {
    private Resources mResources = null;
    private static SkinManager mInstance = null;
    private Context mContext = null;
    private List<String> mActivityName = new ArrayList<String>();
    private List<String> mChangedActivity = new ArrayList<String>();
    private List<OnThemeChangeProcessListener> mChangeTimeListeners = new ArrayList<OnThemeChangeProcessListener>();

    private SharedPreferences mPreferences = null;
    private static final String THEME = "resource";

    /**
     * @Fields COOCAA_INTENT_ACTION_THEME_CHANGE TODO(切换主题的广播)
     */
    public static final String COOCAA_INTENT_ACTION_THEME_CHANGE = "coocaa.intent.action.THEME_CHANGE";

    /**
     * TODO (需要切换主题的View都要实现此接口，在onThemeChange中通过SkinManager中的相关方法重新加载资源)
     *
     * @author luwei
     * @version 2014年12月23日
     */
    public interface OnThemeChangeListener {
        public void onThemeChange();
    }

    /**
     * TODO (如果要监听主题切换开始和结束，那么需要实现这个接口)
     *
     * @author luwei
     * @version 2014年12月23日
     */
    public interface OnThemeChangeProcessListener {
        public void onThemeChangeStart();

        public void onThemeChangeEnd();
    }

    /**
     * TODO (注入监听主题切换开始和结束的接口)
     *
     * @param listener OnThemeChangeProcessListener
     * @author luwei
     * @version 2014年12月23日 以修改时间为准
     */
    public void addThemeChangeTimeListener(OnThemeChangeProcessListener listener) {
        mChangeTimeListeners.add(listener);
    }

    /**
     * TODO (删除监听主题切换开始和结束的接口)
     *
     * @param listener OnThemeChangeProcessListener
     * @author luwei
     * @version 2014年12月23日 以修改时间为准
     */
    public void removeThemeChangeTimeListener(OnThemeChangeProcessListener listener) {
        if (mChangeTimeListeners.contains(listener)) {
            mChangeTimeListeners.remove(listener);
        }
    }

    private boolean bInit = false;

    /**
     * TODO (初始化主题Resources，必须在应用初始化的时候调用)
     *
     * @param context
     * @param path    如果为空则表示直接使用默认主题
     * @return void 对方法返回值的说明
     * @author luwei
     * @version 2014年12月23日 以修改时间为准
     */
    public synchronized void init(Context context, String path) {
        if (bInit)
            return;
        bInit = true;
        mContext = context;
        mPreferences = mContext.getSharedPreferences("skin", 0);
        if (path == null || path.equals("")) {
            path = mPreferences.getString(THEME, "");
        }
        if (path != null && !path.equals("")) {
            mResources = loadApkResources(context, path);
        } else {
            mResources = context.getResources();
        }
    }

    /**
     * TODO (获取皮肤管理单例的实例)
     *
     * @return SkinManger
     * @author luwei
     * @version 2014年12月23日 以修改时间为准
     */
    public static SkinManager getInstance() {
        if (mInstance == null) {
            mInstance = new SkinManager();
        }
        return mInstance;
    }

    private SkinManager() {

    }

    public String getString(int id) {
        return mResources.getString(id);
    }

    /**
     * TODO (设置背景资源，此方法默认会回收前一份背景资源)
     *
     * @param view 需要设置背景的view
     * @param id   背景资源id
     * @author luwei
     * @version 2014年12月23日 以修改时间为准
     */
    public void setBackgroundResource(View view, int id) {
        Drawable drawable = view.getBackground();
        if (drawable != null) {
            drawable.setCallback(null);
        }
        if(mResources != null)
            view.setBackgroundDrawable(mResources.getDrawable(id));
    }

    public XmlPullParser getXmlPullParser(int id) {
        return mResources.getXml(id);
    }

    /**
     * TODO (设置背景颜色)
     *
     * @param view 需要设置背景的view
     * @param id   背景颜色id
     * @author luwei
     * @version 2014年12月23日 以修改时间为准
     */
    public void setBackgroundColor(View view, int id) {
        view.setBackgroundColor(mResources.getColor(id));
    }

    /**
     * TODO (通过资源id获取Bitmap)
     *
     * @param bitmap 在换主题时传入上次使用的bitmap，在这里回收
     * @param id     资源id
     * @return Bitmap null 或者得到的bitmap
     * @author luwei
     * @version 2014年12月23日 以修改时间为准
     */
    public Bitmap getBitmap(Bitmap bitmap, int id) {
        if (bitmap != null && !bitmap.isRecycled()) {
            bitmap.recycle();
            bitmap = null;
        }
        return BitmapFactory.decodeStream(mResources.openRawResource(id));
    }

    public Drawable getDrawable(Drawable oldDrawable, int id) {
        if (oldDrawable != null && oldDrawable.getCallback() != null) {
            oldDrawable.setCallback(null);
            oldDrawable = null;
        }
        return mResources.getDrawable(id);
    }

    /**
     * TODO (根据资源id解析出相关的view)
     *
     * @param id 资源id
     * @return View 解析出的view
     * @author luwei
     * @version 2014年12月23日 以修改时间为准
     */
    public View getLayout(int id) {
        XmlPullParser parser = mResources.getLayout(id);
        return LayoutInflater.from(mContext).inflate(parser, null);
    }

    /**
     * TODO (根据id设置字体颜色)
     *
     * @param view 需要改变颜色的TextView
     * @param id   颜色id
     * @author luwei
     * @version 2014年12月23日 以修改时间为准
     */
    public void setTextColor(TextView view, int id) {
        view.setTextColor(mResources.getColor(id));
    }

    /**
     * TODO (根据id设置字体的大小)
     *
     * @param view 需要改变字体大小的TextView
     * @param id   字体大小的id
     * @author luwei
     * @version 2014年12月23日 以修改时间为准
     */
    public void setTextSize(TextView view, int id) {
        view.setTextSize(mResources.getDimension(id));
    }

    public int getInteger(int id) {
        return mResources.getInteger(id);
    }

    public int getColor(int id) {
        return mResources.getColor(id);
    }

    public float getDimension(int id) {
        return mResources.getDimension(id);
    }

    /**
     * TODO (根据路径解析出的Resources以便加载主题资源时使用)
     *
     * @param context
     * @param apkfile 主题资源存放路径
     * @return Resources 资源加载对象
     * @author luwei
     * @version 2014年12月23日 以修改时间为准
     */
    private static final Resources loadApkResources(Context context, String apkfile) {
        try {
            Class<?> class_AssetManager = Class.forName("android.content.res.AssetManager");
            Object assetMag = class_AssetManager.newInstance();
            Method method_addAssetPath = class_AssetManager.getDeclaredMethod("addAssetPath",
                    String.class);
            method_addAssetPath.invoke(assetMag, apkfile);
            Resources res = context.getResources();
            Constructor<?> constructor_Resources = Resources.class.getConstructor(
                    class_AssetManager, res.getDisplayMetrics().getClass(), res.getConfiguration()
                            .getClass());
            res = (Resources) constructor_Resources.newInstance(assetMag, res.getDisplayMetrics(),
                    res.getConfiguration());
            return res;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * TODO (注册需要切换主题的Activity)
     *
     * @param name Activity的名字
     * @author luwei
     * @version 2014年12月23日 以修改时间为准
     */
    public void registerActivity(String name) {
        mActivityName.add(name);
    }

    /**
     * TODO (取消注册需要切换主题的Activity)
     *
     * @param name Activity的名字
     * @author luwei
     * @version 2014年12月23日 以修改时间为准
     */
    public void unregisterActivity(String name) {
        if (mActivityName.contains(name)) {
            mActivityName.remove(name);
        }
    }

    /**
     * TODO (主题切换完时通知到SkinManager)
     *
     * @param name Activity的名字
     * @author luwei
     * @version 2014年12月23日 以修改时间为准
     */
    public void endChangeTheme(String name) {
        mChangedActivity.add(name);
        if (mActivityName.size() == mChangedActivity.size()) {
            for (OnThemeChangeProcessListener listener : mChangeTimeListeners) {
                listener.onThemeChangeEnd();
            }
        }
    }

    /**
     * TODO (切换主题)
     *
     * @param path 主题存放路径
     * @return boolean 切换是否成功
     * @author luwei
     * @version 2014年12月23日 以修改时间为准
     */
    public boolean changeTheme(String path) {
        Resources resources = loadApkResources(mContext, path);
        if (resources == null) {
            return false;
        }
        editPreference(THEME, path);
        mChangedActivity.clear();
        mResources = resources;
        Intent intent = new Intent(COOCAA_INTENT_ACTION_THEME_CHANGE);
        mContext.sendBroadcast(intent);
        for (OnThemeChangeProcessListener listener : mChangeTimeListeners) {
            listener.onThemeChangeStart();
        }
        return true;
    }

    private void editPreference(String key, String value) {
        Editor editor = mPreferences.edit();
        editor.putString(key, value);
        editor.commit();
    }

    public void destory(){
//        mContext = null;
//        mResources = null;
//        mInstance = null;
    }


}
